/*
 * FileSystem.h
 *
 * Een FileSysteem object is de interne representatie
 * van een gemount filesysteem.
 * Het is tevens de "facade" voor de achterliggende
 * verzameling classes/objecten die de verdere functionaliteit
 * realiseren.
 */

#ifndef FILESYSTEM_H_
#define FILESYSTEM_H_

#include "Inode.h"
#include "OpenFile.h"

class FileSystem
{
private:
	char*	device;

public:
	/**
	 * Creeer een instantie van een filesysteem dat fysiek
	 * is opgeslagen op het gegeven device (of in een file).
	 * b.v.  new FileSystem( "/dev/floppy" );
	 *   of  new FileSystem( "/hio/praktikum/.../floppie") ;
	 *
	 * Constraints:
	 * - Er mag ten alle tijden maar 1 instantie van een
	 *   filesysteem (kunnen) bestaan voor het gegeven device.
	 *   NB Dat er via links synoniemen van "device" kunnen
	 *      bestaan valt buiten de opdracht.
	 */
	FileSystem( const char * device );


	/** Zoek een inode op, gegeven het absolute pad.
	 *  Als de file niet gevonden wordt zijn er,
	 *  naar keuze, twee opties:
	 * OPTIE 1:
	 *	return waarde wordt NULL
	 * OPTIE 2:
	 *	gebruik het c++ exception mechanisme
	 */
	Inode  * findInode( const char * absolute_path );


	/** Zoek een file op in de gegeven directory.
	 *  PAS OP Dit is een 'naam' en GEEN 'pad' !
	 *  Verder analoog aan findInode.
	 *  Vergeet niet te controleren of die inode
	 *  inderdaad een directory is ;-)
	 */
	Inode  * findFile( Inode * dirptr, const char * filename );

	/*  Voetnoot:
	 *  Als in jouw opzet een class Directory bestaat, dan is
	 *	Inode * findFile( Directory * dirptr, ... )
	 *  misschien netter/beter.
	 */

	/* Voor beide bovenstaande methodes geldt dat
	 * er nooit meer dan 1 instantie van een bepaalde
	 * inode mag bestaan.
	 *
	 * Voorbeeld:
	 *	Inode  * ip1 = findInode( "/" );
	 *	Inode  * ip2 = findFile( ip1, "." );
	 *
	 * dan moet gelden dat ip1 === ip2 !!
	 */

	/** Als de "aanroeper" een bepaalde inode niet meer nodig
	 * heeft moet dat kenbaar gemaakt worden via 'releaseInode'.
	 * Deze methode verlaagt de "gebruiks" teller zodat "het"
	 * systeem kan weten welke inode nu (wel/niet) in gebruik zijn.
	 */
	void	releaseInode( Inode * ip );


	/** Geef de verzameling van alle Inodes die nu in gebruik zijn.
	 * NB Het exacte datatype van deze methode moet men zelf bedenken.
	 */
	//..... getAIT();


	// --------------- unix systemcall equivalenten --------------

	// Deze methodes moeten zich zo veel mogelijke gedragen
	// als hun echte tegenhangers.

	OpenFile * open( const char * path );
	int	read( OpenFile * fileptr, char buffer[], int count );
	int	lseek( OpenFile * fileptr, long offset, int whence );
	void	close( OpenFile * fileptr );

	// ------------- "internal" --------------

	/** Geef de verzameling van alle OpenFiles die nu in gebruik zijn.
	 * NB Het exacte datatype van deze methode moet men zelf bedenken.
	 */
	//..... getSOFT();

	// ... andere attributen en methodes ...

};

#endif /* FILESYSTEM_H_ */
